﻿//2841. 几乎唯一子数组的最大和
//给你一个整数数组 nums 和两个正整数 m 和 k 。
//请你返回 nums 中长度为 k 的 几乎唯一 子数组的 最大和 ，如果不存在几乎唯一子数组，请你返回 0 。
// nums 的一个子数组有至少 m 个互不相同的元素，我们称它是 几乎唯一 子数组。
//子数组指的是一个数组中一段连续 非空 的元素序列。

class Solution
{
public:
    unordered_map<long long, int> table;
    int M = 0;
    bool check()
    {
        return table.size() >= M;
    }

    long long maxSum(vector<int>& nums, int m, int k)
    {
        long long ret = 0;
        long long sum = 0;
        int n = nums.size();
        M = m;
        for (int i = 0; i < k; i++)
        {
            table[nums[i]]++;
            sum += nums[i];
        }
        if (check()) ret = sum;
        for (int i = 1; i <= n - k; i++)
        {
            sum += nums[i + k - 1];
            sum -= nums[i - 1];
            table[nums[i + k - 1]]++;
            table[nums[i - 1]]--;
            if (table[nums[i - 1]] == 0) table.erase(nums[i - 1]);
            if (check()) ret = max(sum, ret);
        }
        return ret;
    }
};